var SIGN_REGEXP = /([yMdhsm])(\1*)/g;
var DEFAULT_PATTERN = 'yyyy-MM-dd';
function padding(s, len) {
    var len = len - (s + '').length;
    for (var i = 0; i < len; i++) { s = '0' + s; }
    return s;
};

export default {
    StringFormat() {
        if (arguments.length == 0) {
            return null;
        }
        var str = arguments[0];
        for (var i = 1; i < arguments.length; i++) {
            var re = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
            str = str.replace(re, arguments[i]);
        }
        return str;
    },
    getQueryStringByName: function (name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
        var r = window.location.search.substr(1).match(reg);
        var context = "";
        if (r != null)
            context = r[2];
        reg = null;
        r = null;
        return context == null || context == "" || context == "undefined" ? "" : context;
    },
    /***
    格式化
    *@params money {Number or String} 金额
    *@params digit {Number} 小数点的位数，不够补0
    *@returns {String} 格式化后的金额	  
    **/
    formatMoney(money, digit) {
        var tpMoney = '0.00';
        if (undefined != money) {
            tpMoney = money;
        }
        tpMoney = new Number(tpMoney);
        if (isNaN(tpMoney)) {
            return '0.00';
        }
        tpMoney = tpMoney.toFixed(digit) + '';
        var re = /^(-?\d+)(\d{3})(\.?\d*)/;
        while (re.test(tpMoney)) {
            tpMoney = tpMoney.replace(re, "$1,$2$3")
        }

        return tpMoney;
    },
    formatDate: {
        format: function (date, pattern) {
            pattern = pattern || DEFAULT_PATTERN;
            return pattern.replace(SIGN_REGEXP, function ($0) {
                switch ($0.charAt(0)) {
                    case 'y': return padding(date.getFullYear(), $0.length);
                    case 'M': return padding(date.getMonth() + 1, $0.length);
                    case 'd': return padding(date.getDate(), $0.length);
                    case 'w': return date.getDay() + 1;
                    case 'h': return padding(date.getHours(), $0.length);
                    case 'm': return padding(date.getMinutes(), $0.length);
                    case 's': return padding(date.getSeconds(), $0.length);
                }
            });
        },
        parse: function (dateString, pattern) {
            var matchs1 = pattern.match(SIGN_REGEXP);
            var matchs2 = dateString.match(/(\d)+/g);
            if (matchs1.length == matchs2.length) {
                var _date = new Date(1970, 0, 1);
                for (var i = 0; i < matchs1.length; i++) {
                    var _int = parseInt(matchs2[i]);
                    var sign = matchs1[i];
                    switch (sign.charAt(0)) {
                        case 'y': _date.setFullYear(_int); break;
                        case 'M': _date.setMonth(_int - 1); break;
                        case 'd': _date.setDate(_int); break;
                        case 'h': _date.setHours(_int); break;
                        case 'm': _date.setMinutes(_int); break;
                        case 's': _date.setSeconds(_int); break;
                    }
                }
                return _date;
            }
            return null;
        }
    },
    math: {
        /**
         * 加法运算，避免数据相加小数点后产生多位数和计算精度损失。
         * 
         * @params num1 加数1
         * @params num2 加数2
         * 
         */
        add: function (num1, num2) {
            var baseNum, baseNum1, baseNum2;
            try {
                baseNum1 = num1.toString().split(".")[1].length;
            } catch (e) {
                baseNum1 = 0;
            }
            try {
                baseNum2 = num2.toString().split(".")[1].length;
            } catch (e) {
                baseNum2 = 0;
            }
            baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
            return (num1 * baseNum + num2 * baseNum) / baseNum;
        },
        /**
         * 加法运算，避免数据相减小数点后产生多位数和计算精度损失。
         * 
         * @params num1被减数
         * @params num2减数
         * 
         */
        sub: function (num1, num2) {
            var baseNum, baseNum1, baseNum2;
            var precision;// 精度
            try {
                baseNum1 = num1.toString().split(".")[1].length;
            } catch (e) {
                baseNum1 = 0;
            }
            try {
                baseNum2 = num2.toString().split(".")[1].length;
            } catch (e) {
                baseNum2 = 0;
            }
            baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
            precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;
            return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision);
        },
        /**
         * 乘法运算，避免数据相乘小数点后产生多位数和计算精度损失。
         * 
         * @params num1被乘数
         * @params num2乘数
         * 
         */
        multi:function (num1, num2) {
            var baseNum = 0;
            try {
                baseNum += num1.toString().split(".")[1].length;
            } catch (e) {
            }
            try {
                baseNum += num2.toString().split(".")[1].length;
            } catch (e) {
            }
            return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
        },
        /**
        * 除法运算，避免数据相除小数点后产生多位数和计算精度损失。
        * 
        * @params num1被除数 | num2除数
        */
        div: function (num1, num2) {
            // var baseNum1 = 0, baseNum2 = 0;
            // var baseNum3, baseNum4;
            // try {
            //     baseNum1 = num1.toString().split(".")[1].length;
            // } catch (e) {
            //     baseNum1 = 0;
            // }
            // try {
            //     baseNum2 = num2.toString().split(".")[1].length;
            // } catch (e) {
            //     baseNum2 = 0;
            // }
            // with (Math) {
            //     baseNum3 = Number(num1.toString().replace(".", ""));
            //     baseNum4 = Number(num2.toString().replace(".", ""));
            //     return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1);
            // }
        }
    }



};
